namespace Common;

/// <summary>
/// 统一响应结果类
/// </summary>
/// <typeparam name="T">响应数据类型</typeparam>
/// <remarks>
/// 用于封装API接口的统一返回格式，包含操作状态、消息和数据
/// </remarks>
public class R<T>
{
    /// <summary>
    /// 操作是否成功
    /// </summary>
    /// <value>true表示成功，false表示失败</value>
    public bool Flag {  get; set; }
    
    /// <summary>
    /// 响应消息
    /// </summary>
    /// <value>描述操作结果的文本信息</value>
    public string Message {  get; set; }
    
    /// <summary>
    /// 响应数据
    /// </summary>
    /// <value>返回的业务数据，可为空</value>
    public T? Data {  get; set; }

    /// <summary>
    /// 构造函数（包含数据）
    /// </summary>
    /// <param name="flag">操作是否成功</param>
    /// <param name="message">响应消息</param>
    /// <param name="data">响应数据</param>
    public R(bool flag, string message, T? data)
    {
        this.Flag = flag;
        this.Message = message;
        this.Data = data;
    }

    /// <summary>
    /// 构造函数（不包含数据）
    /// </summary>
    /// <param name="flag">操作是否成功</param>
    /// <param name="message">响应消息</param>
    public R(bool flag, string message)
    {
        this.Flag = flag;
        this.Message = message;
    }

    /// <summary>
    /// 创建成功响应（包含自定义消息和数据）
    /// </summary>
    /// <param name="message">成功消息</param>
    /// <param name="data">响应数据</param>
    /// <returns>成功响应对象</returns>
    public static R<T> Success(string message, T? data) => new R<T>(true, message, data);
    
    /// <summary>
    /// 创建成功响应（仅包含自定义消息）
    /// </summary>
    /// <param name="message">成功消息</param>
    /// <returns>成功响应对象</returns>
    public static R<T> Success(string message) => new R<T>(true, message);   
    
    /// <summary>
    /// 创建成功响应
    /// </summary>
    /// <returns>成功响应对象</returns>
    public static R<T> Success() => new R<T>(true, "操作成功");

    /// <summary>
    /// 创建成功响应（包含数据，使用默认消息）
    /// </summary>
    /// <param name="data">响应数据</param>
    /// <returns>成功响应对象</returns>
    public static R<T> Success(T data) => new R<T>(true, "操作成功", data);

    /// <summary>
    /// 创建失败响应
    /// </summary>
    /// <param name="message">错误消息</param>
    /// <returns>失败响应对象</returns>
    public static R<T> Error(string message) => new R<T>(false, message);

    /// <summary>
    /// 创建失败响应
    /// </summary>
    /// <returns>失败响应对象</returns>
    public static R<T> Error() => new R<T>(false, "操作失败");
}
